String,StringBuilder 以及 StringBuffer 区别
这3个类我们处理字符串数据类型经常会碰到的类,但当面试官问它们之间的区别时,你是否能够快速答出并解释原理呢。如果答案是No的话,这篇文章值得一读。
String
String类实现了Serializable,Comparable和CharSequence接口,具体类图如下所示:
String代表了一个字符串,并且是不可变的。
String类的构造函数不可用,它提供了一系列操作字符串的方法,利用这些方法我们可以得心应手的处理字符串。
String类提供了2个比较方法,分别是
StringBuilder
StringBuilder是一个可变的字符串。相比于StringBuffer,StringBuilder大部分实现效率都更好。StringBuilder最常用的方法就是在尾部添加的append方法和在任意部分添加的insert方法。
要注意StringBuilder的实例是线程不安全的。如果有同步需求的话更推荐使用StringBuffer。
StringBuilder继承自AbstractStringBuilder,并实现了Serializable,Appendable和CharSequence接口
StringBuilder的内部存储结构是一个char型数组,具体实现在它的父类AbstractStringBuilder中。
这里看到了Arrays.copyOf(char[] original, int newLength)方法,此方法调用System.arraycopy()来实现数组拷贝,具体就是把orginal数组拷贝到以newLength为长度的dst数组,如果newLength
sb.getChars内部调用的还是System.arraycopy()方法,通过更改char型数组来实现更改内部存储内容的目的。
StringBuffer
StringBuffer的继承关系和StringBuilder是一致的,内部同样通过char型数组来实现字符串的操作与管理。
总结
- String是不可变的,字符串改变时会创建新的String对象;StringBuilder和StringBuffer是可变的。
- StringBuilder是线程不安全的,而StringBuffer是线程安全的,适合多线程下使用。